package com.biz.primus.ms.adv.dao.redis;

import com.biz.primus.base.redis.CrudRedisDao;
import com.biz.primus.base.redis.util.RedisUtil;
import com.biz.primus.model.adv.enums.AdUsePlace;
import com.biz.primus.model.adv.enums.UseType;
import com.biz.primus.ms.adv.dao.ro.AdPositionRo;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Set;

/**
 * 广告位redis
 *
 * @author jun.liu
 * @date 2017/09/18
 */
@Repository
public class AdPositionRedisDao extends CrudRedisDao<AdPositionRo, Long> {

    /**
     * 保存广告位信息
     */
    @Override
    public void save(AdPositionRo ro) {
        super.save(ro);
        String useTypeKsy = adPositionUseTypeMappingKey(ro.getUseType());
        zadd(useTypeKsy, ro.getCreateTimestamp(), ro.getId());
        String adUsePlaceKey = adPositionUsePlaceMappingKey(ro.getAdUsePlace());
        set(adUsePlaceKey, RedisUtil.toByteArray(ro.getId()));
    }

    /**
     * 根据id，删除redis中的adposition
     */
    @Override
    public void delete(AdPositionRo ro) {
        super.delete(ro);
        zrem(adPositionUseTypeMappingKey(ro.getUseType()), RedisUtil.toByteArray(ro.getId()));
        del(adPositionUsePlaceMappingKey(ro.getAdUsePlace()));
    }

    /**
     * 根据useType查询广告位id信息
     *
     * @param utype
     * @return
     */
    public List<Long> findAdPositionIdsByUseType(UseType utype) {
        String key = adPositionUseTypeMappingKey(utype);
        Long count = super.zCard(key);
        if (count == 0 || count == null) {
            return Lists.newArrayList();
        }
        Set<byte[]> positionIds = super.zrevrangeByScore(key, "+inf", "-inf");
        List<Long> positionIdList = RedisUtil.bytesSetToLongList(positionIds);
        return positionIdList;
    }

    /**
     * 根据使用位置查询广告位
     *
     * @param adUsePlace
     * @return
     */
    public Long findAdPositionByUsePlace(AdUsePlace adUsePlace) {
        String key = adPositionUsePlaceMappingKey(adUsePlace);
        byte[] adPositionId = get(key);
        if (adPositionId != null && adPositionId.length > 0) {
            return RedisUtil.byteArrayToLong(adPositionId);
        }
        return null;
    }

    /**
     * 设置广告位的useType与广告位的映射关系
     *
     * @param useType
     * @return
     */
    private String adPositionUseTypeMappingKey(UseType useType) {
        return getKeyByParams("useType", useType);
    }

    /**
     * 设置广告位与使用位置的映射关系
     *
     * @param adUsePlace
     * @return
     */
    private String adPositionUsePlaceMappingKey(AdUsePlace adUsePlace) {
        return getKeyByParams("adUsePlace", adUsePlace);
    }
}